home *** CD-ROM | disk | FTP | other *** search
- /*
- 3D Viewing and Rotation Using Orthonormal Bases
- by Steve Cunningham
- from "Grahics Gems", Academic Press, 1990
- */
-
- /*
- * Transformations are presented as 4 by 3 matrices, omitting the
- * fourth column to save memory.
- *
- * Functions are used from the Graphics Gems vector C library
- */
-
-
- #include "GraphicsGems.h"
-
- typedef float Transform[4][3];
-
- void BuildViewTransform( VRP, EP, UP, T )
- Point3 VRP, EP, UP;
- Transform T;
- {
- Vector3 U, V, N;
- float dot;
-
- /*
- * Compute vector N = EP - VRP and normalize N
- */
- N.x = EP.x - VRP.x; N.y = EP.y - VRP.y; N.z = EP.z - VRP.z;
- V3Normalize(&N);
-
- /*
- * Compute vector V = VP - VRP
- * Make vector V orthogonal to N and normalize V
- */
- V.x = UP.x - VRP.x; V.y = UP.y - VRP.y; V.z = UP.z - VRP.z;
- dot = V3Dot(&V,&N);
- V.x -= dot * N.x; V.y -= dot * N.y; V.z -= dot * N.z;
- V3Normalize(&V);
-
-
- /*
- * Compute vector U = V x N (cross product)
- */
- V3Cross(&V,&N,&U);
-
- /*
- * Write the vectors U, V, and N as the first three rows of the
- * first, second, and third columns of T, respectively
- */
- T[0][0] = U.x; /* column 1 , vector U */
- T[1][0] = U.y;
- T[2][0] = U.z;
- T[0][1] = V.x; /* column 2 , vector V */
- T[1][1] = V.y;
- T[2][1] = V.z;
- T[0][2] = N.x; /* column 3 , vector N */
- T[1][2] = N.y;
- T[2][2] = N.z;
-
- /*
- * Compute the fourth row of T to include the translation of
- * VRP to the origin
- */
- T[3][0] = - U.x * VRP.x - U.y * VRP.y - U.z * VRP.z;
- T[3][1] = - V.x * VRP.x - V.y * VRP.y - V.z * VRP.z;
- T[3][2] = - N.x * VRP.x - N.y * VRP.y - N.z * VRP.z;
-
- return;
- }
-
-
-